home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
201-225
/
214
/
mandelvroom
/
src
/
menu.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
11KB
|
542 lines
/*
* MandelVroom 2.0
*
* (c) Copyright 1987,1989 Kevin L. Clague, San Jose, CA
*
* All rights reserved.
*
* Permission is hereby granted to distribute this program's source
* executable, and documentation for non-comercial purposes, so long as the
* copyright notices are not removed from the sources, executable or
* documentation. This program may not be distributed for a profit without
* the express written consent of the author Kevin L. Clague.
*
* This program is not in the public domain.
*
* Fred Fish is expressly granted permission to distribute this program's
* source and executable as part of the "Fred Fish freely redistributable
* Amiga software library."
*
* Permission is expressly granted for this program and it's source to be
* distributed as part of the Amicus Amiga software disks, and the
* First Amiga User Group's Hot Mix disks.
*
* contents: this file contains functions to decode Intuition Menu messages.
*/
#include "mandp.h"
extern struct NewScreen NewScreen;
extern int Num_vp_Colors;
char File[80] = "", Path[80] = "Mandelbrot:PROJECTS";
HandleMenuPick( Msg )
register struct IntuiMessage *Msg;
{
register struct MenuItem *Item;
register USHORT code = Msg->Code;
if (code == MENUNULL) {
return;
}
if (State == HELPSTATE) {
HelpMenuCmd(Msg);
State = IDLESTATE;
return;
} else {
State = IDLESTATE;
}
while (code != MENUNULL) {
switch ( MENUNUM( code ) ) {
case PROJECTMENU:
ProjectMenu( Msg, code );
break;
case DISPLAYMENU:
DisplayMenu( Msg, code );
break;
case CALCULATEMENU:
CalculateMenu( Msg, code );
break;
case SPECIALMENU:
SpecialMenu( Msg, code );
break;
}
Item = ItemAddress( (struct Menu *) &Menu[0], (long) code);
code = Item->NextSelect;
}
MaybeNewScreen();
}
/*
* Decide what to do for Project menu's Items
*/
ProjectMenu(Msg,code)
struct IntuiMessage *Msg;
USHORT code;
{
char Name[160];
char *p;
register struct Picture *Pict = CurPict;
register struct Picture *LoadPict;
register struct Window *Window;
register SHORT Type;
struct Picture *NewPict();
if (Pict) {
Window = Pict->Window;
} else {
Window = BackWind;
}
switch (ITEMNUM(code)) {
case NEWITEM:
switch( SUBNUM(code) ) {
case 0:
Type = MANDPICT;
break;
case 1:
Type = JULIAPICT;
break;
}
if ( Pict )
ClonePict( Pict, Type );
else
NewPreset( -1, Type );
break;
case CURITEM:
MakeCurProj( (struct Picture *) Msg->IDCMPWindow->UserData );
break;
case CLOSEPROJ:
CloseWinds( CurPict->Window );
break;
case HELPITEM:
SetWithPointer();
State = HELPSTATE;
break;
case SAVEPROJ:
strcpy( File, Pict->Title+2 );
case LOADITEM:
case SAVEILBM:
switch( ITEMNUM(code) ) {
case LOADITEM: p = "Load Project"; break;
case SAVEPROJ: p = "Save Project"; break;
case SAVEILBM: p = "Save ILBM"; break;
}
if (get_fname(BackWind, screen, p, File, Path)) {
SetSleepyPointer();
strcpy(Name,Path);
if (Name[0] != '\0' && Name[strlen(Name)-1] != ':') {
strcat(Name,"/");
}
strcat(Name,File);
switch( ITEMNUM(code) ) {
case LOADITEM:
(void) LoadPicture( Name );
RefreshContours();
RefreshContours();
CalcHist(CurPict);
ShowStats(CurPict);
SetDirGadget(CurPict);
ModifySpeedPot();
break;
case SAVEPROJ:
PauseChild( Pict );
strncpy( Pict->Title+2, File, sizeof(Pict->Title)-3);
(void) SaveCounts(Name,Pict);
AwakenChild( Pict );
break;
case SAVEILBM:
SaveILBM(Name, Pict->Crngs, 4);
break;
}
SetNormPointer();
}
case CANCELITEM:
State = IDLESTATE;
break;
case QUITITEM:
if (DispErrMsg("Really quit?",1)) {
QuitScreen = TRUE;
}
}
} /* ProjectMenu */
/*
* Decide what to do for Display menu's Items
*/
DisplayMenu(Msg,code)
struct IntuiMessage *Msg;
USHORT code;
{
double gapy,gapx;
extern UBYTE ScreenSizeChanged;
extern UBYTE StandardSize;
extern UBYTE NewDepth;
extern USHORT NewViewModes;
extern struct MenuItem ScreenSizeSubs[];
extern struct MenuItem BorderSubs[];
switch (ITEMNUM(code)) {
case COLORITEM:
OpenPalWind();
break;
case CYCLEITEM:
OpenCycWind();
break;
case CONTOURITEM:
OpenContWind();
break;
case HISTOGRAMITEM:
OpenHistWind();
break;
case AUTOCNTRITEM:
AutoContour(CurPict,SUBNUM(code));
break;
case DEPTHITEM:
NewDepth = SUBNUM(code) + 1;
if (CurPict)
CurPict->Depth = NewDepth;
break;
case VIEWMODEITEM:
EditScreenViewModes(code);
if (CurPict) {
CurPict->ViewModes = NewViewModes;
if (NewViewModes & HIRES && CurPict->Depth > 4) {
CurPict->Depth = 4;
}
}
break;
case SCREENITEM:
StandardSize = (ScreenSizeSubs[0].Flags & CHECKED) == CHECKED;
ScreenSizeChanged = 1;
break;
case BORDERITEM:
if (CurPict) {
int Changed;
Changed = 0;
if ((BorderSubs[0].Flags & CHECKED) == CHECKED) {
/* Make it bordered */
if (CurPict->Flags & BORDERLESS_PROJ &&
CurPict->CountX+LEFTMARG+RIGHTMARG <= screen->Width &&
CurPict->CountY+TOPMARG+BOTMARG <= screen->Height) {
CurPict->Flags &= ~BORDERLESS_PROJ;
Changed = 1;
}
} else {
if (!(CurPict->Flags & BORDERLESS_PROJ)) {
CurPict->Flags |= BORDERLESS_PROJ;
Changed = 1;
}
}
InitBorderSubs();
if (Changed) {
if ( CurPict->cTask ) {
KillReColor( CurPict );
}
PauseChild( CurPict );
ClosePicture(CurPict);
OpenPicture(CurPict);
if (CurPict->Counts)
ReColor(CurPict);
AwakenChild(CurPict);
}
}
break;
}
} /* DisplayMenu */
/*
* Decide what to do for Calculate Menu's Items
*/
CalculateMenu(Msg,code)
struct IntuiMessage *Msg;
USHORT code;
{
extern struct Picture *ZoomedPict;
extern struct MenuItem LensSub[];
double gapy,gapx;
LONG Temp;
extern UBYTE LensOn;
switch (ITEMNUM(code)) {
case GENERATORITEM: /* generator type */
if (CurPict)
CurPict->MathMode = SUBNUM(code);
break;
case ZOOMITEM:
CurPict->ZoomType = SUBNUM(code);
DoZoom( Msg );
break;
case SCROLLITEM:
ScrollPictCmd(Msg);
break;
case LENSITEM:
LensOn = (LensSub[0].Flags & CHECKED) == CHECKED;
break;
case GENERATEITEM:
GenerateCmd(Msg);
break;
case COUNTITEM:
Temp = CurPict->MaxIteration;
if ( GetInt( "Max Iteration", &Temp) == 1 ) {
if (Temp > 1023) Temp = 1023;
CurPict->MaxIteration = Temp;
}
break;
case STATSITEM:
#ifndef DEVELOPMENT
OpenStatsWind( CurPict );
#else
{ char Name[80];
char VD0[80];
strcpy( VD0, "ram:");
if (get_fname(BackWind, screen, "Preset", File, VD0)) {
strcpy(Name,VD0);
if (Name[strlen(Name)-1] != ':') {
strcat(Name,"/");
}
strcat(Name,File);
SavePreset( Name, CurPict );
}
}
#endif
break;
}
} /* CalculateMenu */
DoZoom( Msg )
struct IntuiMessage *Msg;
{
register struct Picture *Pict = CurPict;
if (Pict == NULL)
return;
CloseZoomBox( Pict );
ZoomedPict = Pict; /* Save this so we can use it later */
switch ( SUBNUM(Msg->Code)) {
case ZOOMIN:
ZoomInCmd(Msg);
break;
case ZOOMOUT:
ZoomOutCmd(Msg);
break;
case ZOOMOFF:
ClearZoomBox( ZoomedPict );
break;
case ZOOMJULIA:
SetJuliaCmd(Msg);
break;
}
}
USHORT NewViewModes;
UBYTE NewDepth = 5;
/*
* Modify the NewScreens ViewModes to match the menu
*/
EditScreenViewModes(code)
USHORT code;
{
switch (SUBNUM(code))
{
case HIRESSUB:
NewViewModes ^= HIRES;
break;
case INTERLACESUB:
NewViewModes ^= INTERLACE;
break;
case HALFBRITESUB:
NewViewModes ^= EXTRA_HALFBRITE;
break;
}
} /* EditScreenViewMode */
/*
* Decide what to do for Special Menu's Items
*/
SpecialMenu(Msg, code)
struct IntuiMessage *Msg;
USHORT code;
{
extern SHORT MaxOrbit;
LONG Temp;
int rc;
rc = SUCCESSFUL;
switch (ITEMNUM(code)) {
case ORBITITEM:
OpenOrbitWind();
break;
case MAXORBITEM:
Temp = MaxOrbit;
if ( GetInt( "Max Iteration", &Temp) == 1 ) {
if (Temp > 1023) Temp = 1023;
MaxOrbit = Temp;
}
break;
case ORBITMATHITEM:
ConfOrbMode( SUBNUM(code) );
break;
case PRESETITEM:
rc = SetPreset( SUBNUM( code ) );
if (rc == UNSUCCESSFUL)
DispErrMsg("Can't open preset. Out of RAM",0);
else
if (CurPict->Flags & NO_RAM_GENERATE)
rc = UNSUCCESSFUL;
RefreshContours();
}
return( rc );
} /* SpecialMenu */
LoadPicture( Name )
char Name[];
{
struct Picture *LoadPict;
LoadPict = NewPict( MANDPICT );
if ( LoadPict ) {
if ( LoadCounts( Name, LoadPict ) == UNSUCCESSFUL ) {
ThrowPict( LoadPict );
GetCurPict();
return(UNSUCCESSFUL);
}
} else {
ErrNoPict();
return(UNSUCCESSFUL);
}
return(SUCCESSFUL);
}
char *
ExtractName( FullPath )
char *FullPath;
{
char *File,*rindex(),*p;
File = rindex( FullPath, '/' );
if (File == NULL)
File = rindex( FullPath, ':' );
if (File)
File += 1;
/* Save a copy of it */
strcpy( Path, FullPath );
p = &Path[ File - FullPath - 1 ];
if (*p == '/') *p = '\0';
if (*p == ':') *(p+1) = '\0';
return( File );
}